package com.transpeed.payservice.webDaoImpl;

import java.io.IOException;

import javax.ws.rs.FormParam;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

import org.json.JSONObject;

import com.transpeed.payservice.Utils.JsonUtils;
import com.transpeed.payservice.log.InitLogger;
import com.transpeed.payservice.log.Log;
import com.transpeed.payservice.main.PostMessage;
import com.transpeed.payservice.model.PosCarInfo;
import com.transpeed.payservice.model.PosLocalCarInfo;
import com.transpeed.payservice.pay.unionpospay.PosMain;


/**
 * TODO POS机相关API
 * PosPay  用于接收上位机刷POS机请求,并下发给本地POS服务程序执行付款
 * PosLocalReceive 用于本地PC接收服务器启动Pos交易POST请求
 * QueryPosTrad 用于服务器接收本地PC POS信息POST请求(主要为了待上位机查询使用)
 * @author lizhi
 * @date 2017年4月25日
 * 更新日志
 * 2017年3月13日 lizhi 首次创建
 *
 */

@Path("/PosTradeAPI")
public class PosTradeAPI {


/**
 * @author lizhi
 * @date 2017年3月13日 TODO 用于接收上位机刷POS机请求,并下发给本地POS服务程序执行付款
 */
	
	@POST
	@Path("/PosPay")
	@Produces(MediaType.TEXT_HTML)
	// @Consumes(MediaType.APPLICATION_FORM_URLENCODED)
	// 本地测试
	// http://192.168.0.102:8080/TranSpeed-PayService/PosTradeAPI/PosPay?TotalAmount=1&CarInPlace=苏州新区站&CarOutPlace=苏州北站&CarPlate=苏E11111&CarInTime=2017-2-19
	// 09:23:48&url=192.168.0.100:8080
	// 服务器测试
	// http://122.97.128.110:8080/TranSpeed-PayService/PosTradeAPI/PosPay?TotalAmount=1&CarInPlace=苏州新区站&CarOutPlace=苏州北站&CarPlate=苏E11111&CarInTime=2017-2-19
	// 09:23:48&url=192.168.0.100:8080
	// 物联网卡测试
	// http://192.168.254.5:8080/TranSpeed-PayService/PosTradeAPI/PosPay?TotalAmount=1&CarInPlace=苏州新区站&CarOutPlace=苏州北站&CarPlate=苏E11111&CarInTime=2017-2-19
	// 09:23:48&url=192.168.0.100:8080
	public String PosPay(
			@FormParam("TotalAmount") String TotalAmount,
			@FormParam("CarInPlace") String CarInPlace,
			@FormParam("CarOutPlace") String CarOutPlace,
			@FormParam("CarPlate") String CarPlate,
			@FormParam("CarInTime") String CarInTime,
			@FormParam("url") String NotifyUrl

	) throws IOException {

		PosLocalCarInfo.ServerPosStatusSign = false;// 初始化POS机交易状态（以备上位机查询使用）
		PosLocalCarInfo.ServerPosTradeNumber = null;// 初始化空值

		PosCarInfo ParkInfo = new PosCarInfo();

		ParkInfo.setTotalAmount(TotalAmount);
		ParkInfo.setCarInPlace(CarInPlace);
		ParkInfo.setCarOutPlace(CarOutPlace);
		ParkInfo.setCarPlate(CarPlate);
		ParkInfo.setCarInTime(CarInTime);
		ParkInfo.setNotifyUrl(NotifyUrl);

		InitLogger.Createfolder();

		Log.Write("收到上位机生成刷卡请求！车辆信息为：\n" + JsonUtils.formatAsJSON(new JSONObject(ParkInfo).toString()), "ServerPos");

		String PosTradeNumber = "UmsPayPos" + System.currentTimeMillis() + (long) (Math.random() * 10000000L);

		Log.Write("刷卡金额为:" + TotalAmount, "ServerPos");
		Log.Write("收到的上位机通知地址:" + NotifyUrl, "ServerPos");
		Log.Write("服务器生成银联订单号为：" + PosTradeNumber, "ServerPos");
		String message = "TotalAmount=" + TotalAmount + "&NotifyUrl=" + NotifyUrl + "&PosTradeNumber=" + PosTradeNumber;

		if (NotifyUrl.indexOf("http://") == -1) // 等于-1表示这个字符串中没有o这个字符
			NotifyUrl = "http://" + NotifyUrl + "/TranSpeed-PayService/PosTradeAPI/PosLocalReceive";
		else
			NotifyUrl = NotifyUrl + "/TranSpeed-PayService/PosTradeAPI/PosLocalReceive";

		String response = PostMessage.PosPost(message, NotifyUrl, "ServerPos");

		if (response.equals("1"))
			Log.Write("刷卡信息发送到本地服务程序成功！！！", "ServerPos");

		//return 给上位机订单号反馈
		return PosTradeNumber;
	}

	/**
	 * @author lizhi
	 * @date 2017年3月13日 TODO 用于本地PC接收服务器启动Pos交易POST请求
	 */
	@POST
	@Path("/PosLocalReceive")
	// Path:
	// http://192.168.0.102:8080/TranSpeed-PayService/PosTradeAPI/PosLocalReceive
	@Produces(MediaType.TEXT_HTML)
	// @Consumes(MediaType.APPLICATION_FORM_URLENCODED)
	public String PosLocalReceive(@FormParam("TotalAmount") String TotalAmount,
			@FormParam("NotifyUrl") String NotifyUrl,
			@FormParam("PosTradeNumber") String PosTradeNumber)
			throws IOException {

		PosLocalCarInfo PosParkInfo = new PosLocalCarInfo();
		
		PosParkInfo.setTotalAmount(TotalAmount);
		PosParkInfo.setNotifyUrl(NotifyUrl);
		PosParkInfo.setPosTradeNumber(PosTradeNumber);
		InitLogger.Createfolder();
		Log.Write("收到服务器消息！\n" + JsonUtils.formatAsJSON(new JSONObject(PosParkInfo).toString()), "LocalPos");
		Log.Write("开始启动POS收费！！！", "LocalPos");

		PosMain trade = new PosMain(TotalAmount, NotifyUrl, PosTradeNumber);
		trade.start();

		Log.Write("POS收费已就绪！！！", "LocalPos");

		return "1";// 表示成功接收
	}

	/**
	 * @author 用于接收上位机查询银联POS订单请求
	 * 
	 */

	@POST
	@Path("/QueryPosTrade")
	// 本地测试
	// http://192.168.0.102:8080/TranSpeed-PayService/PosTradeAPI/QueryPosTrade?TradeNumber=UmsPayPos14909501372204761086
	// 服务器测试
	// http://122.97.128.110:8080/TranSpeed-PayService/PosTradeAPI/QueryPosTrade?TradeNumber=UmsPayPos14909501372204761086
	// 物联网卡测试
	// http://192.168.254.5:8080/TranSpeed-PayService/PosTradeAPI/QueryPosTrade?TradeNumber=UmsPayPos14909501372204761086
	@Produces(MediaType.TEXT_HTML)
	// @Consumes(MediaType.APPLICATION_FORM_URLENCODED)
	public String QueryPosTrade(@FormParam(value = "TradeNumber") String TradeNumber)throws IOException {

		// LocalPosCarInfo.ServerPosTradeNumber = "123456";
		//LocalPosCarInfo.ServerPosStatusSign = false;
		
		if(TradeNumber.equals("失败"))//上位机获取订单号失败的时候会传失败参数
			return "UmsPayPos&Failed&107";	
		
		String PosQueryInfo = null;

		if (TradeNumber.equals(PosLocalCarInfo.ServerPosTradeNumber))
			if (PosLocalCarInfo.ServerPosStatusSign == true)
				PosQueryInfo = "UmsPayPos&Success&100";
			else
				PosQueryInfo = "UmsPayPos&Failed&111";
		else
			PosQueryInfo = "UmsPayPos&Failed&113";

		InitLogger.Createfolder();
		Log.Write(PosQueryInfo, "ServerPos");
		return PosQueryInfo;
	}

	/**
	 * @author lizhi
	 * @date 2017年3月13日 TODO 用于服务器接收本地PC POS信息POST请求(主要为了待上位机查询使用)
	 */

	// Path:
	// http://192.168.0.102:8080/TranSpeed-PayService/PosTradeAPI/PosServerReceive
	@POST
	@Path("/PosServerReceive")
	@Produces(MediaType.TEXT_HTML)
	// @Consumes(MediaType.APPLICATION_FORM_URLENCODED)
	public String PosServerReceive(String PosTradeFromPC) throws IOException {
		InitLogger.Createfolder();
		// PosTradeFromPC 为 支付后（无论成功还失败均会回传值）来自本地服务的返回值
		Log.Write("收到来自本地PC的支付结果!结果为：" + PosTradeFromPC, "ServerPos");

		String[] message = PosTradeFromPC.split("&");// 对返回值进行切割&号放入数组中保存
		Log.Write("存入服务器端ServerPosTradeNumber: " + message[2], "ServerPos");
		Log.Write("存入服务器端ServerPosStatusSign: " + message[3], "ServerPos");

		// 将本地传来的信息存入服务器端程序，订单号、订单状态标识保存在全局变量中

		PosLocalCarInfo.ServerPosTradeNumber = message[2];
		PosLocalCarInfo.ServerPosStatusSign = Boolean.valueOf(message[3]).booleanValue(); // 字符型转布尔型存值

		return PosTradeFromPC;
	}

}
